import json
import sys
import io
import time

# 设置sys.stdout的编码为UTF-8
sys.stdout.reconfigure(encoding='utf-8')
# 创建一个新的输出流，并设置编码为UTF-8
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
# 将 当且路径 添加到path中
sys.path.append(r'.')
from DrissionPage import ChromiumPage


def load_param_datas_from_file(file_path):
    with open(file_path, "r", encoding='utf-8') as f:
        json_file_datas = json.loads(f.read())  # load的传入参数为字符串类型
        return json_file_datas


def page_listen_data(param_file):
    json_file_datas = load_param_datas_from_file(param_file)

    ip = json_file_datas['ip']
    port = json_file_datas['port']
    open_url = json_file_datas['openUrl']
    listen_url = json_file_datas['listenUrl']
    clickDivText = None
    if 'clickDivText'in json_file_datas:
        clickDivText = json_file_datas['clickDivText']

    result_file = json_file_datas['resultFile']

    # 监听URL
    page = ChromiumPage(addr_or_opts=ip + ':' + str(port))

    tab = page.new_tab()  # 新建标签页，获取标签页对象
    tab.listen.start(listen_url)  # 开始监听，指定获取包含该文本的数据包

    # 打开第一个页面
    tab.get(open_url)
    time.sleep(1)
    # 打开第二个页面
    if clickDivText:
        clickDiv = tab.ele('tag:div@@text()=' +clickDivText)
        if clickDiv :
            clickDiv.click()
    # 等待页面加载
    tab.wait.load_start()
    # 滚动到最底部
    tab.scroll.to_bottom()

    res = tab.listen.wait()  # 等待并获取一个数据包

    page_data = {
        "url": res.url,
        "headers": dict(res.request.headers),
        "cookies": res.request.cookies,
        "postData": res.request.postData,
        "responseBody": res.response.body
    }
    json_data = json.dumps(page_data)
    # print(json_data)
    # 将数据保存到JSON文件中，保留汉字的原始形式
    with open(result_file, "w", encoding="utf-8") as file:
        json.dump(page_data, file, ensure_ascii=False)

    tab.close()


def main():
    """
     通过sys模块来识别参数demo, http://blog.csdn.net/ouyang_peng/
    """
    py_name = sys.argv[0]
    param_file = 'page_listen_data.py.param.json'
    if len(sys.argv) >= 2:
        param_file = sys.argv[1]

    page_listen_data(param_file)


if __name__ == "__main__":
    main()
